module modular_db.module_module;

import modular_db.database;
import modular_db.module_;
import modular_db.module_qualification;

@safe:

struct ModuleModule {
    mixin moduleFields;
}

struct ModuleModuleLoader {
    enum url = "https://github.com/SirNickolas/modular_db";
    enum version_ = 1L;

    static ModuleModule load(Database db, ModuleQualification q) nothrow @system
    in {
        assert(!q.id, "ID for the module module must be 0");
    }
    do {
        return ModuleModule(db, q);
    }

    static ModuleModule setup(Database db, ModuleQualification q) @system
    in {
        assert(!q.id, "ID for the module module must be 0");
    }
    do {
        // As a special case, `setup` for this module is called when there is no corresponding
        // entry in "0modules" table (in fact, the table itself has not been created yet).
        db.execute(q.format!`
            CREATE TABLE [-|0modules](
                oid INTEGER PRIMARY KEY,
                url TEXT NOT NULL UNIQUE,
                version INTEGER NOT NULL CHECK(version >= 1)
            )
        `);
        db.execute(q.format!`
            INSERT INTO [-|0modules]
            VALUES (0, ?, ?)
        `, url, version_);
        return ModuleModule(db, q);
    }

    static ModuleModule migrate(Database, ModuleQualification q, long) @system
    in {
        assert(!q.id, "ID for the module module must be 0");
    }
    do {
        assert(false, "There are no previous versions");
    }
}